package com.fakesmoker.aidawnda.manager;/**
 * @program: aidawnda
 * @author: lcy
 * @create: 2024-11-17 00:02
 */

/**
 2024/11/17,
 */

import com.zhipu.oapi.ClientV4;
import com.zhipu.oapi.Constants;
import com.zhipu.oapi.service.v4.model.*;
import io.reactivex.Flowable;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * 封装ai调用处理类
 * @author lcy
 */
@Component
public class AiManager {
    @Resource
    private ClientV4 clientV4;


    // 较稳定的随机数
    private static final float STABLE_TEMPERATURE = 0.05f;

    // 不稳定的随机数
    private static final float UNSTABLE_TEMPERATURE = 0.80f;

    /**
     * 同步调用（答案较稳定）
     *
     * @param systemMessage
     * @param userMessage
     * @return
     */
    public String doSyncStableRequest(String systemMessage, String userMessage) {
        return doSyncRequest(systemMessage, userMessage, STABLE_TEMPERATURE);
    }
    /**
     * 流式同步调用（答案较稳定）
     *
     * @param systemMessage
     * @param userMessage
     * @return
     */
    public Flowable<ModelData> doStreamStableRequest(String systemMessage, String userMessage) {
        return doStreamRequest(systemMessage, userMessage, STABLE_TEMPERATURE);
    }

    /**
     * 同步调用（答案较随机）
     *
     * @param systemMessage
     * @param userMessage
     * @return
     */
    public String doSyncUnstableRequest(String systemMessage, String userMessage) {
        return doSyncRequest(systemMessage, userMessage, UNSTABLE_TEMPERATURE);
    }


    /**
     * 同步调用方法
     * @param systemMessage
     * @param userMessage
     * @param temperature
     * @return
     */
    public String doSyncRequest(String systemMessage, String userMessage, Float temperature) {
        return doRequest(systemMessage, userMessage, Boolean.FALSE, temperature);
    }
  /**
     * 流式调用方法
     * @param systemMessage
     * @param userMessage
     * @param temperature
     * @return
     */
    public Flowable<ModelData> doStreamRequest(String systemMessage, String userMessage, Float temperature) {
        //构建请求
        List<ChatMessage> messages = new ArrayList<>();
        ChatMessage systemChatMessage = new ChatMessage(ChatMessageRole.SYSTEM.value(),systemMessage);
        ChatMessage userChatMessage = new ChatMessage(ChatMessageRole.USER.value(),userMessage);
        messages.add(systemChatMessage);
        messages.add(userChatMessage);

        return doStreamRequest(messages,temperature);
    }



    /**
     * 调用方法
     * @param systemMessages 系统参数
     * @param userMessage 用户输入参数
     * @param isStream  是否流式返回
     * @param temperature 控制离散
     * @return 返回ai生成结果
     */
    public String doRequest(String systemMessages, String userMessage, Boolean isStream, Float temperature){

        //构建请求
        List<ChatMessage> messages = new ArrayList<>();
        ChatMessage systemChatMessage = new ChatMessage(ChatMessageRole.SYSTEM.value(),systemMessages);
        ChatMessage userChatMessage = new ChatMessage(ChatMessageRole.USER.value(),userMessage);
        messages.add(systemChatMessage);
        messages.add(userChatMessage);

        return doRequest(messages,isStream,temperature);

    }


    /**
     * 通用调用方法
     * @param chatMessageList 请求参数
     * @param isStream  是否流式返回
     * @param temperature 控制离散
     * @return 返回ai生成结果
     */
    public String doRequest(List<ChatMessage> chatMessageList, Boolean isStream, Float temperature){

        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
                .model(Constants.ModelChatGLM4)
                .stream(isStream)
                .temperature(temperature) //控制离散
                .invokeMethod(Constants.invokeMethod)//同步调用
                .messages(chatMessageList)
                .build();
        ModelApiResponse invokeModelApiResp = clientV4.invokeModelApi(chatCompletionRequest);
        return invokeModelApiResp.getData().getChoices().get(0).getMessage().getContent().toString();
    }

    /**
     * 流式方法
     * @param chatMessageList 请求参数
     * @param temperature 控制离散
     * @return 返回ai生成结果
     */
    public Flowable<ModelData> doStreamRequest(List<ChatMessage> chatMessageList, Float temperature){

        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
                .model(Constants.ModelChatGLM4)
                .stream(Boolean.TRUE)
                .temperature(temperature) //控制离散
                .invokeMethod(Constants.invokeMethod)//同步调用
                .messages(chatMessageList)
                .build();
        ModelApiResponse invokeModelApiResp = clientV4.invokeModelApi(chatCompletionRequest);
        return invokeModelApiResp.getFlowable();
    }


}
